package cn.xiaosiyuan.util.io.codeFile;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.util.CharsetUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.List;





// 获取多个文件（支持java、js文件）的源码，删除其中的空行、注释（单行注释和多行注释），然后把过滤后的源码输入到txt文件中
//          // 开头的单行
//           /*...*/ 多行
//          空行

// 未添加规则（一般在脚本文件，配置文件或其他语言中的注释规则）

/**
 * jsp文件中的是 <!----> 注释
 */
//          # 开头的单行
//           ; 开头的单行

public class CodeFileUtil {


    /**
     * 生成过滤后的源码文件
     * @param path 生成文件的绝对路径，文件不存在会自动生成
     * @param sourceCodePaths 源码绝对路径名
     */
    public static void genFilterCode(String path, String sourceCodePaths) {
        File txtFile = (FileUtil.exist(path)) ? new File(path) : FileUtil.newFile(path);
        FileWriter fileWriter = FileWriter.create(txtFile, CharsetUtil.CHARSET_UTF_8);
        List<File> files = getFiles(sourceCodePaths);
        if (files.size() > 0) {
            for (int i = 0; i < files.size(); i++) {
                File file = files.get(i);
                FileReader fileReader = FileReader.create(file);
                String converted = convert(fileReader.readLines());
                fileWriter.append(converted);
            }
        }

//        System.out.println("生成成功！");
    }


    /**
     * 删除空行
     * 删除单行注释
     * 删除多行注释
     */
    private static String convert(List<String> code) {
        StringBuilder result = new StringBuilder();

        if (code.size() > 0) {
            for (int i = 0; i < code.size(); i++) {
                String line = code.get(i);
                if (
                        !line.trim().startsWith("//")
                                && !line.trim().equals("")
                                && !line.trim().startsWith("/**")
                                && !line.trim().startsWith("/*")
                                && !line.trim().startsWith("*")
                                && !line.trim().endsWith("*/")
                ) {
                    // 不添加 "\r\n" 可以变成压缩源码的功能
                    result.append(line + "\r\n");
                }
            }
        }

        return result.toString();
    }

    /**
     * @param filePaths 源码文件绝对路径，多个文件用逗号隔开
     * @return 文件集合
     */
    private static List<File> getFiles(String filePaths) {
        List<File> result = new ArrayList<>();
        String[] split = filePaths.split(",");
        for (int i = 0; i < split.length; i++) {
            String s = split[i];
            result.add(new File(s));
        }
        return result;
    }


}
